#define _CRT_SECURE_NO_WARNINGS 1
#include <vector>
#include <algorithm>

class Solution {
public:
    double findMedianSortedArrays(std::vector<int>& nums1, std::vector<int>& nums2) {
        int m = nums1.size();
        int n = nums2.size();
        if (m > n) {
            return findMedianSortedArrays(nums2, nums1);
        }
        int imin = 0;
        int imax = m;
        int maxlift = 0;
        int minright = 0;
        while (imin <= imax) {
            int i, j;
            i = (imin + imax) / 2;
            j = (m + n + 1) / 2 - i;
            if (i != 0 && j != n && nums1[i - 1] > nums2[j]) {
                imax = i - 1;
            }
            else if (i != m && j != 0 && nums1[i] < nums2[j - 1]) {
                imin = i + 1;
            }
            else {
                if (i == 0) {
                    maxlift = nums2[j - 1];
                }
                else if (j == 0) {
                    maxlift = nums1[i - 1];
                }
                else {
                    maxlift = std::max(nums1[i - 1], nums2[j - 1]);
                }

                if ((m + n) % 2 == 1) {
                    return maxlift;
                }

                if (i == m) {
                    minright = nums2[j];
                }
                else if (j == n) {
                    minright = nums1[i];
                }
                else {
                    minright = std::min(nums1[i], nums2[j]);
                }
                break;
            }
        }
        return (maxlift + minright) / 2.0;
    }
};